package QianFeng07.IODemo.ObjectStream;

import java.io.*;
import java.util.Arrays;

/**
 * 对象流
 * 对象流的两个类:
 * ObjectOutputStream将Java对象的基本数据类型和图形写入OutputStream
 * objectInputStream对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化。
 *
 * 列化和反序列化的概念：
 * 1、把对象转换为字节序列的过程称为对象的序列化。
 * 2、把字节序列恢复为对象的过程称为对象的反序列化。
 * 对象的序列化主要有两种用途：
 * 1、把对象的字节序列永久地保存到硬盘上，通常存放在一个文件中；
 * 2、在网络上传送对象的字节序列。
 *
 * 序列化一组对象:
 * 在序列化操作中，同时序列化多个对象时，反序列化也必须按顺序操作，如果想要序列化一组对象该如何操作呢?
 *      答：序列化一组对象可采用:对象数组的形式，因为对象数组可以向Object进行转型操作。
 *
 * transient关键字:
 * 如果用transient声明一个实例变量，当对象存储时，它的值不需要维持。
 **/
public class ObjectStreamDemo {
    public static void main(String[] args) {
        //writeObject();
        readObject();
    }

    //对象序列化  把对象写入文件：实际写入的是类名、属性、属性类型、属性的值等
    private static void writeObject() {
        Dog dog = new Dog("旺旺",18,"公");
        Dog dog1 = new Dog("涛宝", 1, "母");
        Dog[] dogs = {dog, dog1};
        File file = new File("F:\\Test\\dogs.obj");
        try {
            OutputStream out = new FileOutputStream(file);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
            //要序列化对象，对象的类必须实现Serializable接口
            objectOutputStream.writeObject(dogs);
            objectOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //反序列化过程  从文件中把对象的内容读取出来，还原成对象
    private static void readObject() {
        File file = new File("F:\\Test\\dogs.obj");
        try {
            InputStream in = new FileInputStream(file);
            ObjectInputStream objectInputStream = new ObjectInputStream(in);
            //要序列化对象，对象的类必须实现Serializable接口
            Dog[] dog = (Dog[])objectInputStream.readObject();
            objectInputStream.close();
            System.out.println(Arrays.toString(dog));
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
